
The main goal in this document in cover the very basics formatation for Rmarkdown, no matter if you are building a Html or pdf document. If you are new to Rmarkdown, please check the following reference for instalation guidance: https://bookdown.org/yihui/rmarkdown/installation.html
Text Formatation
Lists
a. Ordered list
1. First Element
2. Second Element
+ Nested Element
+ Another Nested Element
b. Unordered list
* Text
* Another text
+ Nested text
- Other option for list
+ Again nested text
Page Break
To add a page break, as the example above, you can simply type four or more dashes or asteristics:
------ or
******
Blockquotes
a. Plain Code Block
Since the beggining of this session I am using this option to show how to apply each of the formattings introduced up to now. With them it is possible to write some code in a fixed-width box, but not evaulating it:
```
This text is displayed as it is **typed!**
```
b. Blockquotes
Can be used to add some quotes in your markdown file, as in the following example.
“No medicine cures what happiness cannot”
Gabriel Garcia Marques
:)
> No medicine cures what happiness cannot
> *Gabriel Garcia Marques*
> :)
Code
Echo Options
To insert some codes in the markdown document, the called code chunk, it is necessary to add three backticks like ´´´ followed by {r}, where r indicates the language name. To close the code chunk, add another three backticks in the end. You can write chunk options in the curly braces, as we are going to see in the following examples.
## speed dist
## Min. : 4.0 Min. : 2.00
## 1st Qu.:12.0 1st Qu.: 26.00
## Median :15.0 Median : 36.00
## Mean :15.4 Mean : 42.98
## 3rd Qu.:19.0 3rd Qu.: 56.00
## Max. :25.0 Max. :120.00
Another easier way to add a R code chunk is simply type: “ctrl + alt + i”. It is possible to control the code output adding some chunk options inside the curly braces: {r }.
Following, some very useful options that I use very frequently:
- eval: TRUE to evaluate the code chunk
- echo: TRUE to show the code in the output document
- results: If “hide” the text output will be hidden, “asis” for write a text as is.
- collapse: TRUE to merge output text and the code into a single code block in the output.
- Warning, message and error: Whether to show warnings, messages and error in the output document
- include: When include = FALSE, the whole code chunk is excluded in the output, but note that it will still be evaluated if eval = TRUE.
- cache: If caching is enabled, the same code chunk will not be evaluated the next time the document is compiled (if the code chunk was not modified), which can save you time.
- fig.width and fig.height: The (graphical device) size of R plots in inches. Ex: fig.width = 6 and fig.height = 4 or fig.dim = c(6, 4).
- out.width and out.height: The output size of R plots in the output document. These options may scale images. You can use percentages, e.g., out.width = ‘80%’ means 80% of the page width.
- fig.align: The alignment of plots. It can be ‘left’, ‘center’, or ‘right’.
- fig.cap: To include some figure caption.
For a better understanding of how these options work, we can see some examples below:
- {r, include = FALSE}
- Code not shown
- results not shown
- {r, echo = FALSE}
- Code not shown
- results shown
## speed dist
## Min. : 4.0 Min. : 2.00
## 1st Qu.:12.0 1st Qu.: 26.00
## Median :15.0 Median : 36.00
## Mean :15.4 Mean : 42.98
## 3rd Qu.:19.0 3rd Qu.: 56.00
## Max. :25.0 Max. :120.00
- {r, results = ‘hide’}
- Code shown
- Results not shown
- {r, collapse=TRUE}
- To merge the code and the output
summary(cars)
## speed dist
## Min. : 4.0 Min. : 2.00
## 1st Qu.:12.0 1st Qu.: 26.00
## Median :15.0 Median : 36.00
## Mean :15.4 Mean : 42.98
## 3rd Qu.:19.0 3rd Qu.: 56.00
## Max. :25.0 Max. :120.00
- {r, out.width=‘30%’, fig.align=‘center’, fig.cap=‘Amazing Hong Kong’}
- Another option for including images and captions.
knitr::include_graphics('C:/Users/gabriela.mourao/Documents/6-PESSOAL/timon-studler-49992-unsplash.jpg')
- {r, fig.align=‘center’, fig.width = 6, fig.height=4}
- It is possible to adjust the graph size as well its alignment in the output document
ggplot(cars, aes(x=speed, y=dist)) +
geom_point(alpha=1) +
labs(title = "Speed vs. Distance", x = "Speed", y = "Distance") +
theme_bw()

There are many options available for control the Code Chunk output, if you want more information about it in the following links you can find good references:
https://yihui.name/knitr/options/
https://bookdown.org/yihui/rmarkdown/r-code.html
https://www.overleaf.com/learn/latex/Positioning_images_and_tables
Inline Code
If one wants to add just a small code expression in the markdown text, it is necessary to add one backticks like in the example below:
For example:
- The total speed in Cars dataset is 770
- The total distance in Cars dataset is 2149
Images
For images, the syntax is very similar to links:

^[photo by timon studler on unsplash]
Tables
Inserting manual tables in Rmarkdown is very easy:
| 1.0 |
Text Formatation |
| 2.0 |
Output formats |
| 3.0 |
Code options |
| 4.0 |
Formulas |
| 5.0 |
Links |
| 6.0 |
Images |
| 7.0 |
Tables |
|Number Section|Section Name|
|:---:|:---:|
|1.0|Text Formatation|
|2.0|Output formats|
|3.0|Code options|
|4.0|Formulas|
|5.0|Links|
|6.0|Images|
|7.0|Tables|
LS0tDQp0aXRsZTogIlJNYXJrZG93bjogSW50cm9kdWN0b3J5IFR1dG9yaWFsIg0KYXV0aG9yOiAiR2FicmllbGEgTW91cuNvIg0KZGF0ZTogIjI3IGRlIG5vdmVtYnJvIGRlIDIwMTgiDQpvdXRwdXQ6IA0KICAgICAgaHRtbF9kb2N1bWVudDoNCiAgICAgICAgICAgIGNvZGVfZm9sZGluZzogc2hvdw0KICAgICAgICAgICAgdG9jOiB5ZXMNCiAgICAgICAgICAgIHRvY19kZXB0aDogMg0KICAgICAgICAgICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgICAgICAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUNCiAgICAgICAgICAgIGhpZ2hsaWdodDogaGFkZG9jaw0KICAgICAgICAgICAgY3NzOiBCZWF1dGlmdWxSLmNzcw0KLS0tDQoNCjxpbWcgc3JjPSJSbG9nby5zdmciIHN0eWxlPSJwb3NpdGlvbjpmaXhlZDt0b3A6MTBweDtsZWZ0OjUwcHg7IiB3aWR0aD0iMTQwIiBoZWlnaHQ9IjE0MCIvPg0KDQo8c3R5bGU+DQogYTp2aXNpdGVkIHsNCiAgICBjb2xvcjogT3JhbmdlOw0KfQ0KDQogYTpob3ZlciB7DQogICAgY29sb3I6IE9yYW5nZTsNCn0NCjwvc3R5bGU+DQoNCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShwbG90bHkpDQojYXV0b21hdGljYWxseSBmb3JtYXQgdGhlIFIgY29kZQ0KbGlicmFyeShmb3JtYXRSKQ0KYGBgDQo8YnI+DQpUaGUgbWFpbiBnb2FsIGluIHRoaXMgZG9jdW1lbnQgaW4gY292ZXIgdGhlIHZlcnkgYmFzaWNzIGZvcm1hdGF0aW9uIGZvciBSbWFya2Rvd24sIG5vIG1hdHRlciBpZiB5b3UgYXJlIGJ1aWxkaW5nIGEgSHRtbCBvciBwZGYgZG9jdW1lbnQuDQpJZiB5b3UgYXJlIG5ldyB0byBSbWFya2Rvd24sIHBsZWFzZSBjaGVjayB0aGUgZm9sbG93aW5nIHJlZmVyZW5jZSBmb3IgaW5zdGFsYXRpb24gZ3VpZGFuY2U6DQpodHRwczovL2Jvb2tkb3duLm9yZy95aWh1aS9ybWFya2Rvd24vaW5zdGFsbGF0aW9uLmh0bWwNCjxicj4NCg0KIyBUZXh0IEZvcm1hdGF0aW9uIA0KDQojIyBCYXNpYyBGb3JtYXRhdGlvbiAgIA0KKiphLiBNYW51YWwgbGluZSBCcmVhayoqICAgDQoNClRvIGFkZCBhIGxpbmUgYnJlYWssIHlvdSBjYW4gdHlwZSB0d28gb3IgbW9yZSBzcGFjZXMgaW4gdGhlIGVuZCBvZiB0aGUgbGluZSwganVzdCBsaWtlIHRoYXQ6ICAgDQoqdGhpcyBpcyBhIG5ldyBsaW5lKiAgIA0KDQoqKmIuSGVhZGVycyB0eXBlKioNCg0KYGBgDQojIEhlYWRlciAxDQojIyBIZWFkZXIgMg0KIyMjIEhlYWRlciAzDQoNCmBgYA0KKipjLlRleHQgRW1waGFzaXMqKiAgIA0KICAgDQoqLSBJdGFsaWMgRm9ybWF0KiAgIA0KKiotIEJvbGQgRm9ybWF0KiogICANCi0gU3Vic2NyaXB0fjF+ICAgICANCi0gU3VwZXJzY3JpcHReMV4NCg0KDQpgYGANCipJdGFsaWMqIG9yIF9pdGFsaWNfDQoqKkJvbGQqKiBvciBfX0JvbGRfXw0KU3Vic2NyaXB0fjF+DQpTdXBlcnNjcmlwdF4xXg0KYGBgDQogDQoNCiMjIExpc3RzDQoNCioqYS4gT3JkZXJlZCBsaXN0KiogICANCg0KDQpgYGANCjEuIEZpcnN0IEVsZW1lbnQNCjIuIFNlY29uZCBFbGVtZW50DQogICAgICArIE5lc3RlZCBFbGVtZW50DQogICAgICArIEFub3RoZXIgTmVzdGVkIEVsZW1lbnQNCmBgYA0KKipiLiBVbm9yZGVyZWQgbGlzdCoqICANCg0KDQpgYGANCiogVGV4dCANCiogQW5vdGhlciB0ZXh0DQogICAgICArIE5lc3RlZCB0ZXh0DQotIE90aGVyIG9wdGlvbiBmb3IgbGlzdA0KICAgICAgKyBBZ2FpbiBuZXN0ZWQgdGV4dA0KDQpgYGANCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMjIFBhZ2UgQnJlYWsNCg0KVG8gYWRkIGEgcGFnZSBicmVhaywgYXMgdGhlIGV4YW1wbGUgYWJvdmUsIHlvdSBjYW4gc2ltcGx5IHR5cGUgZm91ciBvciBtb3JlIGRhc2hlcyBvciBhc3RlcmlzdGljczoNCg0KYGBgDQotLS0tLS0gb3IgDQoqKioqKioNCg0KYGBgDQojIyBCbG9ja3F1b3Rlcw0KDQoqKmEuIFBsYWluIENvZGUgQmxvY2sgKioNCg0KU2luY2UgdGhlIGJlZ2dpbmluZyBvZiB0aGlzIHNlc3Npb24gSSBhbSB1c2luZyB0aGlzIG9wdGlvbiB0byBzaG93IGhvdyB0byBhcHBseSBlYWNoIG9mIHRoZSBmb3JtYXR0aW5ncyBpbnRyb2R1Y2VkIHVwIHRvIG5vdy4gV2l0aCB0aGVtIGl0IGlzIHBvc3NpYmxlIHRvIHdyaXRlIHNvbWUgY29kZSBpbiBhIGZpeGVkLXdpZHRoIGJveCwgIGJ1dCBub3QgZXZhdWxhdGluZyBpdDoNCg0KYGBgDQogICAgICBgYGANCiAgICAgIFRoaXMgdGV4dCBpcyBkaXNwbGF5ZWQgYXMgaXQgaXMgKip0eXBlZCEqKiANCiAgICAgIGBgYA0KYGBgDQoqKmIuIEJsb2NrcXVvdGVzKiogIA0KDQpDYW4gYmUgdXNlZCB0byBhZGQgc29tZSBxdW90ZXMgaW4geW91ciBtYXJrZG93biBmaWxlLCBhcyBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUuICANCg0KPiAiTm8gbWVkaWNpbmUgY3VyZXMgd2hhdCBoYXBwaW5lc3MgY2Fubm90IiAgIA0KPiAgIA0KPiAqR2FicmllbCBHYXJjaWEgTWFycXVlcyogICANCj4gOikgICANCg0KYGBgDQo+IE5vIG1lZGljaW5lIGN1cmVzIHdoYXQgaGFwcGluZXNzIGNhbm5vdCAgDQo+ICpHYWJyaWVsIEdhcmNpYSBNYXJxdWVzKiAgDQo+IDopDQoNCmBgYA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMgT3V0cHV0IGZvcm1hdHMgICANCg0KVGhlcmUgYXJlIHNldmVyYWwgb3V0cHV0cyBmb3JtYXRzIGF2YWlsYWJsZSBpbiBNYXJrZG93bjogIA0KDQoqIGJlYW1lcl9wcmVzZW50YXRpb24gIA0KKiBnaXRodWJfZG9jdW1lbnQgICAgICAgDQoqIGh0bWxfZG9jdW1lbnQgICANCiogaW9zbGlkZXNfcHJlc2VudGF0aW9uICAgDQoqIGxhdGV4X2RvY3VtZW50ICAgDQoqIG1kX2RvY3VtZW50ICAgDQoqIG9kdF9kb2N1bWVudCAgIA0KKiBwZGZfZG9jdW1lbnQgICANCiogcG93ZXJwb2ludF9wcmVzZW50YXRpb24gICANCiogcnRmX2RvY3VtZW50ICAgDQoqIHNsaWR5X3ByZXNlbnRhdGlvbiAgIA0KKiB3b3JkX2RvY3VtZW50ICAgDQoNClVwIHRvIG5vdywgdGhpcyB0dXRvcmlhbCBoYXZlIGJlZW4gZm9jdXNpbmcgb24gbWFya2Rvd24gc3ludGF4IGluIGEgbW9yZSBicm9hZGx5IHdheSwgQnV0IG5vdywgbGV0cyBmb2N1cyBvbiBzb21lIG9wdGlvbnMgZm9yICoqaHRtbF9kb2N1bWVudCoqIG91dHB1dC4gICAgDQpJZiB5b3UgdHlwZSA/cm1hcmtkb3duOjpodG1sX2RvY3VtZW50IGluIHlvdXIgUiBjb25zb2xlLCB5b3UgY2FuIGdldCBhIGxpc3Qgb2YgYWxsIG9wdGlvbnMgZm9yIEhUTUwgZG9jdW1lbnQuIFRoZSBvbmVzIHRoYXQgSSB1c2UgbW9zdCBhcmUgZGVzY3JpYmVkIGJlbG93OiAgIA0KDQotICoqY29kZV9mb2xkaW5nOioqIEVuYWJsZSBkb2N1bWVudCByZWFkZXJzIHRvIHRvZ2dsZSB0aGUgZGlzcGxheSBvZiBSIGNvZGUgY2h1bmtzLiBTcGVjaWZ5ICJub25lIiB0byBkaXNwbGF5IGFsbCBjb2RlIGNodW5rcyAoYXNzdW1pbmcgdGhleSB3ZXJlIGtuaXQgd2l0aCBlY2hvID0gVFJVRSkuIFNwZWNpZnkgImhpZGUiIHRvIGhpZGUgYWxsIFIgY29kZSBjaHVua3MgYnkgZGVmYXVsdCAodXNlcnMgY2FuIHNob3cgaGlkZGVuIGNvZGUgY2h1bmtzIGVpdGhlciBpbmRpdmlkdWFsbHkgb3IgZG9jdW1lbnQtd2lkZSkuIFNwZWNpZnkgInNob3ciIHRvIHNob3cgYWxsIFIgY29kZSBjaHVua3MgYnkgZGVmYXVsdC4gICANCi0gKip0b2M6KiogdG8gaW5jbHVkZSBhIHRhYmxlIG9mIGNvbnRlbnRzIGluIHRoZSBvdXRwdXQgICAgIA0KLSAqKnRvY19kZXB0aDoqKiBEZXB0aCBvZiBoZWFkZXJzIHRvIGluY2x1ZGUgaW4gdGFibGUgZm9ybWF0ICAgIA0KLSAqKnRvY19mbG9hdDoqKiBUUlVFIHRvIGZsb2F0IHRoZSB0YWJsZSBvZiBjb250ZW50cyAgICAgIA0KLSAqKkNvZGVfZG93bmxvYWQ6KiogRW1iZWRlZCB0aGUgUm1kIHNvdXJjZSBjb2RlIHdpdGhpbiB0aGUgZG9jdW1lbnQgYW5kIHByb3ZpZGUgYSBsaW5rIHRoYXQgY2FuIGJlIHVzZWQgYnkgcmVhZGVycyB0byBkb3dubG9hZCB0aGUgY29kZS4gICANCi0gKipudW1iZXJfc2VjdGlvbnM6KiogVFJVRSB0byBudW1iZXIgc2VjdGlvbiBoZWFkaW5ncw0KLSAqKnNlbGZfY29udGVhaW5lZDoqKiBQcm9kdWNlIGEgc3RhbmRhbG9uZSBIVE1MIGZpbGUgd2l0aCBubyBleHRlcm5hbCBkZXBlbmRlbmNpZXMuDQoNCiMjIFVzYWdlIGV4YW1wbGVzOg0KDQpGb2xsb3dpbmcgeW91IGNhbiBmaW5kIHNvbWUgdXNhZ2UgZXhhbXBsZXMgb2YgdGhlIG1lbnRpb25lZCBvcHRpb25zOg0KDQpgYGANCiAgICAgIGh0bWxfZG9jdW1lbnQ6DQogICAgICAgICAgICBjb2RlX2ZvbGRpbmc6IHNob3cNCiAgICAgICAgICAgIHRvYzogeWVzDQogICAgICAgICAgICB0b2NfZGVwdGg6IDENCiAgICAgICAgICAgIHRvY19mbG9hdDogeWVzDQogICAgICAgICAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICAgICAgICAgIGhpZ2hsaWdodDogaGFkZG9jaw0KICAgICAgICAgICAgdGhlbWU6IGx1bWVuDQpgYGANCg0KIVtdKEM6L1VzZXJzL2dhYnJpZWxhLm1vdXJhby9Eb2N1bWVudHMvNi1QRVNTT0FML1ItZmlsZXMvVFVUT1JJQUxfTUFSS0RPV04vb3V0cHV0MS5wbmcpIA0KDQo8YnI+DQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICANCg0KSW5jbHVkaW5nIHNlY3Rpb24gbnVtYmVyOiAgIA0KDQpgYGANCm91dHB1dDogDQogICAgICBodG1sX2RvY3VtZW50Og0KICAgICAgICAgICAgY29kZV9mb2xkaW5nOiBzaG93DQogICAgICAgICAgICB0b2M6IHllcw0KICAgICAgICAgICAgdG9jX2RlcHRoOiAyDQogICAgICAgICAgICB0b2NfZmxvYXQ6IHllcw0KICAgICAgICAgICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgICAgICAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUNCiAgICAgICAgICAgIGhpZ2hsaWdodDogaGFkZG9jaw0KICAgICAgICAgICAgdGhlbWU6IGx1bWVuDQoNCmBgYA0KIVtdKEM6L1VzZXJzL2dhYnJpZWxhLm1vdXJhby9Eb2N1bWVudHMvNi1QRVNTT0FML1ItZmlsZXMvVFVUT1JJQUxfTUFSS0RPV04vb3V0cHV0Mi5wbmcpICAgDQoNCjxicj4NCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCjxicj4NCkZsYXRseSB0aGVtZTogICANCg0KIVtdKEM6L1VzZXJzL2dhYnJpZWxhLm1vdXJhby9Eb2N1bWVudHMvNi1QRVNTT0FML1ItZmlsZXMvVFVUT1JJQUxfTUFSS0RPV04vZmxhdGx5LnBuZykNCg0KPGJyPiAgDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICANCg0KSm91cm5hbCB0aGVtZTogICANCiFbXShDOi9Vc2Vycy9nYWJyaWVsYS5tb3VyYW8vRG9jdW1lbnRzLzYtUEVTU09BTC9SLWZpbGVzL1RVVE9SSUFMX01BUktET1dOL2pvdXJuYWxfYW5kX2hhZGRvY2sucG5nKQ0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgDQoNCkx1bWVuIHRoZW1lOiAgIA0KIVtdKEM6L1VzZXJzL2dhYnJpZWxhLm1vdXJhby9Eb2N1bWVudHMvNi1QRVNTT0FML1ItZmlsZXMvVFVUT1JJQUxfTUFSS0RPV04vbHVtZW4ucG5nKQ0KDQo8YnI+DQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgIA0KDQojIENvZGUNCg0KIyMgRWNobyBPcHRpb25zDQoNClRvIGluc2VydCBzb21lIGNvZGVzIGluIHRoZSBtYXJrZG93biBkb2N1bWVudCwgdGhlIGNhbGxlZCBjb2RlIGNodW5rLCBpdCBpcyBuZWNlc3NhcnkgdG8gYWRkIHRocmVlIGJhY2t0aWNrcyBsaWtlILS0tCBmb2xsb3dlZCBieSB7cn0sIHdoZXJlIHIgaW5kaWNhdGVzIHRoZSBsYW5ndWFnZSBuYW1lLiBUbyBjbG9zZSB0aGUgY29kZSBjaHVuaywgYWRkIGFub3RoZXIgdGhyZWUgYmFja3RpY2tzIGluIHRoZSBlbmQuIFlvdSBjYW4gd3JpdGUgY2h1bmsgb3B0aW9ucyBpbiB0aGUgY3VybHkgYnJhY2VzLCBhcyB3ZSBhcmUgZ29pbmcgdG8gc2VlIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZXMuICAgICANCg0KYGBge3J9DQpzdW1tYXJ5KGNhcnMpDQpgYGANCg0KQW5vdGhlciBlYXNpZXIgd2F5IHRvIGFkZCBhIFIgY29kZSBjaHVuayBpcyBzaW1wbHkgdHlwZTogImN0cmwgKyBhbHQgKyBpIi4gSXQgaXMgcG9zc2libGUgdG8gY29udHJvbCB0aGUgY29kZSBvdXRwdXQgYWRkaW5nIHNvbWUgY2h1bmsgb3B0aW9ucyBpbnNpZGUgdGhlIGN1cmx5IGJyYWNlczoge3IgfS4gICANCkZvbGxvd2luZywgc29tZSB2ZXJ5IHVzZWZ1bCBvcHRpb25zIHRoYXQgSSB1c2UgdmVyeSBmcmVxdWVudGx5OiAgIA0KDQotICoqZXZhbDoqKiBUUlVFIHRvIGV2YWx1YXRlIHRoZSBjb2RlIGNodW5rICANCi0gKiplY2hvOioqIFRSVUUgdG8gc2hvdyB0aGUgY29kZSBpbiB0aGUgb3V0cHV0IGRvY3VtZW50ICAgDQotICoqcmVzdWx0czoqKiBJZiAiaGlkZSIgdGhlIHRleHQgb3V0cHV0IHdpbGwgYmUgaGlkZGVuLCAiYXNpcyIgZm9yIHdyaXRlIGEgdGV4dCBhcyBpcy4gICAgDQotICoqY29sbGFwc2U6KiogVFJVRSB0byBtZXJnZSBvdXRwdXQgdGV4dCBhbmQgdGhlIGNvZGUgaW50byBhIHNpbmdsZSBjb2RlIGJsb2NrIGluIHRoZSBvdXRwdXQuICAgDQotICoqV2FybmluZywgbWVzc2FnZSBhbmQgZXJyb3I6KiogV2hldGhlciB0byBzaG93IHdhcm5pbmdzLCBtZXNzYWdlcyBhbmQgZXJyb3IgaW4gdGhlIG91dHB1dCBkb2N1bWVudCANCi0gKippbmNsdWRlOioqIFdoZW4gaW5jbHVkZSA9IEZBTFNFLCB0aGUgd2hvbGUgY29kZSBjaHVuayBpcyBleGNsdWRlZCBpbiB0aGUgb3V0cHV0LCBidXQgbm90ZSB0aGF0IGl0IHdpbGwgc3RpbGwgYmUgZXZhbHVhdGVkIGlmIGV2YWwgPSBUUlVFLiAgIA0KLSAqKmNhY2hlOioqIElmIGNhY2hpbmcgaXMgZW5hYmxlZCwgdGhlIHNhbWUgY29kZSBjaHVuayB3aWxsIG5vdCBiZSBldmFsdWF0ZWQgdGhlIG5leHQgdGltZSB0aGUgZG9jdW1lbnQgaXMgY29tcGlsZWQgKGlmIHRoZSBjb2RlIGNodW5rIHdhcyBub3QgbW9kaWZpZWQpLCB3aGljaCBjYW4gc2F2ZSB5b3UgdGltZS4gICANCi0gKipmaWcud2lkdGggYW5kIGZpZy5oZWlnaHQ6KiogVGhlIChncmFwaGljYWwgZGV2aWNlKSBzaXplIG9mIFIgcGxvdHMgaW4gaW5jaGVzLiBFeDogZmlnLndpZHRoID0gNiBhbmQgZmlnLmhlaWdodCA9IDQgb3IgZmlnLmRpbSA9IGMoNiwgNCkuICANCi0gKipvdXQud2lkdGggYW5kIG91dC5oZWlnaHQ6KiogVGhlIG91dHB1dCBzaXplIG9mIFIgcGxvdHMgaW4gdGhlIG91dHB1dCBkb2N1bWVudC4gVGhlc2Ugb3B0aW9ucyBtYXkgc2NhbGUgaW1hZ2VzLiBZb3UgY2FuIHVzZSBwZXJjZW50YWdlcywgZS5nLiwgb3V0LndpZHRoID0gJzgwJScgbWVhbnMgODAlIG9mIHRoZSBwYWdlIHdpZHRoLiAgIA0KLSAqKmZpZy5hbGlnbjoqKiBUaGUgYWxpZ25tZW50IG9mIHBsb3RzLiBJdCBjYW4gYmUgJ2xlZnQnLCAnY2VudGVyJywgb3IgJ3JpZ2h0Jy4gIA0KLSAqKmZpZy5jYXA6ICoqIFRvIGluY2x1ZGUgc29tZSBmaWd1cmUgY2FwdGlvbi4NCg0KRm9yIGEgYmV0dGVyIHVuZGVyc3RhbmRpbmcgb2YgaG93IHRoZXNlIG9wdGlvbnMgd29yaywgd2UgY2FuIHNlZSBzb21lIGV4YW1wbGVzIGJlbG93OiAgIA0KDQoxLiAqKntyLCBpbmNsdWRlID0gRkFMU0V9KiogICANCiAgICAgICsgQ29kZSBub3Qgc2hvd24gICANCiAgICAgICsgcmVzdWx0cyBub3Qgc2hvd24gICANCjIuICoqe3IsIGVjaG8gPSBGQUxTRX0qKiAgIA0KICAgICAgKyBDb2RlIG5vdCBzaG93bg0KICAgICAgKyByZXN1bHRzIHNob3duICAgDQpgYGB7ciwgZWNobz1GQUxTRX0NCnN1bW1hcnkoY2FycykNCmBgYA0KDQoNCjMuICoqe3IsIHJlc3VsdHMgPSAnaGlkZSd9KiogICANCiAgICAgICsgQ29kZSBzaG93biAgIA0KICAgICAgKyBSZXN1bHRzIG5vdCBzaG93biAgIA0KYGBge3IsIHJlc3VsdHM9J2hpZGUnfQ0Kc3VtbWFyeShjYXJzKQ0KYGBgDQoNCg0KNC4gKip7ciwgY29sbGFwc2U9VFJVRX0qKiAgIA0KICAgICAgKyBUbyBtZXJnZSB0aGUgY29kZSBhbmQgdGhlIG91dHB1dCAgIA0KYGBge3IsIGNvbGxhcHNlPVRSVUV9DQpzdW1tYXJ5KGNhcnMpDQoNCmBgYA0KDQoNCjUuICoqe3IsIG91dC53aWR0aD0nMzAlJywgZmlnLmFsaWduPSdjZW50ZXInLCBmaWcuY2FwPSdBbWF6aW5nIEhvbmcgS29uZyd9KiogICANCiAgICAgICsgQW5vdGhlciBvcHRpb24gZm9yIGluY2x1ZGluZyBpbWFnZXMgYW5kIGNhcHRpb25zLiANCg0KDQpgYGB7ciwgb3V0LndpZHRoPSczMCUnLCBmaWcuYWxpZ249J2NlbnRlcicsIGZpZy5jYXA9J0FtYXppbmcgSG9uZyBLb25nJ30NCg0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoJ0M6L1VzZXJzL2dhYnJpZWxhLm1vdXJhby9Eb2N1bWVudHMvNi1QRVNTT0FML3RpbW9uLXN0dWRsZXItNDk5OTItdW5zcGxhc2guanBnJykNCg0KYGBgDQoNCg0KDQo2LiAqKntyLCBmaWcuYWxpZ249J2NlbnRlcicsIGZpZy53aWR0aCA9IDYsIGZpZy5oZWlnaHQ9NH0qKiAgIA0KICAgICAgKyBJdCBpcyBwb3NzaWJsZSB0byBhZGp1c3QgdGhlIGdyYXBoIHNpemUgYXMgd2VsbCBpdHMgYWxpZ25tZW50IGluIHRoZSBvdXRwdXQgZG9jdW1lbnQNCg0KYGBge3IsIGZpZy5hbGlnbj0nY2VudGVyJywgZmlnLndpZHRoID0gNiwgZmlnLmhlaWdodD00fQ0KDQpnZ3Bsb3QoY2FycywgYWVzKHg9c3BlZWQsIHk9ZGlzdCkpICsNCiAgICAgIGdlb21fcG9pbnQoYWxwaGE9MSkgKyANCiAgICAgIGxhYnModGl0bGUgPSAiU3BlZWQgdnMuIERpc3RhbmNlIiwgeCA9ICJTcGVlZCIsIHkgPSAiRGlzdGFuY2UiKSArIA0KICAgICAgdGhlbWVfYncoKQ0KDQoNCmBgYA0KDQogICANClRoZXJlIGFyZSBtYW55IG9wdGlvbnMgYXZhaWxhYmxlIGZvciBjb250cm9sIHRoZSBDb2RlIENodW5rIG91dHB1dCwgaWYgeW91IHdhbnQgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBpdCBpbiB0aGUgZm9sbG93aW5nIGxpbmtzIHlvdSBjYW4gZmluZCBnb29kIHJlZmVyZW5jZXM6ICAgDQpodHRwczovL3lpaHVpLm5hbWUva25pdHIvb3B0aW9ucy8gICANCmh0dHBzOi8vYm9va2Rvd24ub3JnL3lpaHVpL3JtYXJrZG93bi9yLWNvZGUuaHRtbCAgIA0KaHR0cHM6Ly93d3cub3ZlcmxlYWYuY29tL2xlYXJuL2xhdGV4L1Bvc2l0aW9uaW5nX2ltYWdlc19hbmRfdGFibGVzDQoNCg0KDQojIyBJbmxpbmUgQ29kZSAgDQoNCklmIG9uZSB3YW50cyB0byBhZGQganVzdCBhIHNtYWxsIGNvZGUgZXhwcmVzc2lvbiBpbiB0aGUgbWFya2Rvd24gdGV4dCwgaXQgaXMgbmVjZXNzYXJ5IHRvIGFkZCBvbmUgYmFja3RpY2tzIGxpa2UgaW4gdGhlIGV4YW1wbGUgYmVsb3c6ICAgDQogICAgICANCkZvciBleGFtcGxlOiAgIA0KLSBUaGUgdG90YWwgc3BlZWQgaW4gQ2FycyBkYXRhc2V0IGlzIGByIHN1bShjYXJzJHNwZWVkKWAgICANCi0gVGhlIHRvdGFsIGRpc3RhbmNlIGluIENhcnMgZGF0YXNldCBpcyBgciBzdW0oY2FycyRkaXN0KWANCg0KDQohW10oQzovVXNlcnMvZ2FicmllbGEubW91cmFvL0RvY3VtZW50cy82LVBFU1NPQUwvUi1maWxlcy9UVVRPUklBTF9NQVJLRE9XTi9JbmxpbmVfY29kZS5wbmcpDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIEZvcm11bGFzICAgIA0KDQojIyBJbmxpbmUgYW5kIGRpc3BsYXkgbW9kZQ0KDQpJZiB5b3UgYXJlIHR5cGluZyBqdXN0IGEgc21hbGwgZm9ybXVsYSwgeW91IG1pZ2h0IGp1c3Qgd2FudCB0byBhZGQgaXQgaW4gdGhlIGxpbmUgdGhhdCB5b3UgYXJlIHR5cGluZy4gZm9yIGV4YW1wbGU6ICJUaGlzIGlzIGFuIGlubGluZSBleGFtcGxlIGZvcm11bGE6ICRFPW1jXjIkIg0KDQpgYGANCiAgICAgICJUaGlzIGlzIGFuIGlubGluZSBleGFtcGxlIGZvcm11bGE6ICRFPW1jXjIkIg0KDQpgYGANCg0KQnV0LCBpZiB5b3UgYXJlIHR5cGluZyBhIHZlcnkgbG9uZyBleHByZXNzaW9uLCB5b3UgbWlnaHQgdGhpbmsgdGhhdCBpcyBiZXR0ZXIgdG8gdXNlIHRoZSBkaXNwbGF5IG1vZGU6ICQkYV5uICsgYl5uID0gKGEgLSBiKShhXntuLTF9ICsgYV57bi0yfWIgKyBhXntuLTN9Yl4yICsgLi4uICsgYWJee24tMn0gKyBiXntuLTF9KSQkDQoNCmBgYA0KICAgJCRhXm4gKyBiXm4gPSAoYSAtIGIpKGFee24tMX0gKyBhXntuLTJ9YiArIGFee24tM31iXjIgKyAuLi4gKyBhYl57bi0yfSArIGJee24tMX0pJCQNCg0KYGBgDQoNCiMjIFN5bWJvbHM6DQoNClNvbWUgdXNlZnVsIHN5bWJvbCBmb3JtYXRhdGlvbnM6DQoNCnxTeW1ib2x8IExhdGV4IHwgQ29tbWVudA0KfDotLS06fDotLS06fDotLS06fA0KfCRccG0kfCBgXHBtYCB8IHBsdXMgb3IgbWludXN8DQp8JFxkaXYkfGBcZGl2YHwgZGl2aWRlZCBieXwNCnwkXHRpbWVzJHxgXHRpbWVzYHx0aW1lc3wNCnwkXGdlJHwgYFxnZWAgfCBncmVhdGVyIG9yIGVxdWFsfA0KfCRcbGUkfCBgXGxlYCB8IGxlc3Mgb3IgZXF1YWwgfA0KfCRcZm9yYWxsJHwgYFxmb3JhbGxgfCBGb3IgYWxsfA0KfCRcbmUkfCBgXG5lYHwgTm90IGVxdWFsfA0KfCRcc2ltJHwgYFxzaW1gfCBpcyBzaW1pbGFyIHRvfA0KfCRcaW4kfCBgXGluYHwgaXMgbWVtYmVyIG9mfA0KfCRcbWF0aGJie1J9JHwgYFxtYXRoYmJ7Un1gIHwgU2V0IG9mIHJlYWwgbnVtYmVyc3wNCnwkXGhhdHt5fSR8YFxoYXR7eX1gfCB5IGhhdHwNCnwkXGJhcnt5fSR8YFxiYXJ7eX1gfCB5IGJhcnwNCg0KIyMgR3JlZWsgTGV0dGVycyAgDQoNCnxTeW1ib2x8IExhdGV4IHwgQ29tbWVudA0KfDotLS06fDotLS06fDotLS06fA0KfCRcYWxwaGEkfCBgXGFscGhhYCB8IGFscGhhfA0KfCRcYmV0YSR8YFxiZXRhYHwgYmV0YXwNCnwkXERlbHRhfmFuZH5cZGVsdGEkfGBcRGVsdGEgYW5kIFxkZWx0YWB8RGVsdGF8DQp8JFxlcHNpbG9ufmFuZH5cdmFyZXBzaWxvbiR8IGBcZXBzaWxvbiBhbmQgXHZhcmVwc2lsb25gIHwgZXBzaWxvbnwNCnwkXEdhbW1hfmFuZH5cZ2FtbWEkfCBgXEdhbW1hIGFuZCBcZ2FtbWFgIHxHYW1tYXwNCnwkXHBpJHwgYFxwaWB8IHBpfA0KfCRcU2lnbWF+XHNpZ21hflx2YXJzaWdtYSR8IGBcU2lnbWEgXHNpZ21hIFx2YXJzaWdtYWB8IFNpZ21hfA0KDQojIyBJbmRleA0KDQokJA0KXGJlZ2lue2FsaWdufQ0KeF9pLCB4X3tpfSAmJiBcdGV4dHsoU3Vic2NyaXB0KX1cXA0KeF4yICYmIFx0ZXh0eyhTdXBlcnNjcmlwdCl9XFwNCnheMl9pLH54XjJfe2ksan0gJiYgXHRleHR7KENvbWJpbmVkKX1cICANClxlbmR7YWxpZ259DQokJA0KDQpgYGANCnhfaSwgeF97aX0gKFN1YnNjcmlwdCkNCnheMiAoU3VwZXJzY3JpcHQpDQp4XjJfaSwgeF4yX3tpLGp9IChDb21iaW5lZCkgIA0KDQpgYGANCg0KIyMgRXhwcmVzc2lvbnMNCg0KIyMjIFNxdWFyZSByb290cw0KVG8gaW5kaWNhdGUgYSBzcXVhcmUgcm9vdCwgdXNlIGBcc3FydGA6ICRcc3FydHt4fSQNCg0KYGBgDQokXHNxcnR7eH0kDQoNCmBgYA0KDQojIyMgRnJhY3Rpb25zDQpUaGUgZnJhY3Rpb25zIGFyZSBkaXNwbGF5ZWQgdXNpbmcgYFxmcmFjYCBzeW1ib2w6PGJyPiAgDQokeD1cZnJhY3sxfXsxK2Vee1xiZXRhXzArXGJldGFfezF9XHRpbWVzIHl9fSQ8YnI+ICAgDQpvciBhZGRpbmcgYSBwYXJhbnRlc2lzOjxicj4gICANCiR4PVxsZWZ0KFxmcmFjezF9ezErZV57XGJldGFfMCtcYmV0YV97MX1cdGltZXMgeX19XHJpZ2h0KSQ8YnI+DQoNCmBgYA0KJHg9XGZyYWN7MX17MStlXntcYmV0YV8wK1xiZXRhX3sxfVx0aW1lcyB5fX0kICAgDQoNCiR4PVxsZWZ0KFxmcmFjezF9ezErZV57XGJldGFfMCtcYmV0YV97MX1cdGltZXMgeX19XHJpZ2h0KSQNCg0KYGBgDQojIyMgU3VtbWF0aW9uIGV4cHJlc3Npb24NClRvIGFkZCBhIHN1bW1hdGlvbiBzaWduLCB5b3UgY2FuIHVzZSBgXHN1bWAgYW5kIGNvbWJpbmUgaXQgd2l0aCB0aGUgaW5kZXggc3ludGF4IGludHJvZHVjZWQgYWJvdmU6DQokXHN1bV97aT0xfV5uKHlfaS1caGF0e3l9KV4yJA0KDQpgYGANCiRcc3VtX3tpPTF9Xm4oeV9pLVxoYXR7eX0pXjIkDQoNCmBgYA0KDQojIyMgT3RoZXJzDQokJFxpbnRfMF57YX0geF5rfmR4JCQNCg0KYGBgIA0KJCRcaW50XzBee2F9IHhea35keCQkDQoNCmBgYA0KDQokJCBcZnJhY3tccGFydGlhbCB1fXtccGFydGlhbCB0fQ0KICAgPSBoXjIgXGxlZnQoIFxmcmFje1xwYXJ0aWFsXjIgdX17XHBhcnRpYWwgeF4yfQ0KICAgICAgKyBcZnJhY3tccGFydGlhbF4yIHV9e1xwYXJ0aWFsIHleMn0NCiAgICAgICsgXGZyYWN7XHBhcnRpYWxeMiB1fXtccGFydGlhbCB6XjJ9IFxyaWdodCkgJCQgIA0KDQoNCmBgYA0KJCQgXGZyYWN7XHBhcnRpYWwgdX17XHBhcnRpYWwgdH0NCiAgID0gaF4yIFxsZWZ0KCBcZnJhY3tccGFydGlhbF4yIHV9e1xwYXJ0aWFsIHheMn0NCiAgICAgICsgXGZyYWN7XHBhcnRpYWxeMiB1fXtccGFydGlhbCB5XjJ9DQogICAgICArIFxmcmFje1xwYXJ0aWFsXjIgdX17XHBhcnRpYWwgel4yfSBccmlnaHQpICQkDQpgYGANCg0KJCRcbGltX3t4IFx0byArXGluZnR5fSBcZnJhY3szeF4yICs3eF4zfXt4XjIgKzV4XjR9ID0gMyQkDQoNCmBgYA0KJCRcbGltX3t4IFx0byArXGluZnR5fSBcZnJhY3szeF4yICs3eF4zfXt4XjIgKzV4XjR9ID0gMyQkDQpgYGANCg0KDQojIyBNYXRyaWNlcw0KDQokJFxtYXRoYmZ7WH0gPSBcbGVmdFtcYmVnaW57YXJyYXl9DQp7cnJyfQ0KMiAmIDQgJiA2IFxcDQo4ICYgMTAgJiAxMiBcXA0KMTQgJiAxNiAmIDE4DQpcZW5ke2FycmF5fVxyaWdodF0kJA0KDQpgYGANCiQkXG1hdGhiZntYfSA9IFxsZWZ0W1xiZWdpbnthcnJheX0NCntycnJ9DQoyICYgNCAmIDYgXFwNCjggJiAxMCAmIDEyIFxcDQoxNCAmIDE2ICYgMTgNClxlbmR7YXJyYXl9XHJpZ2h0XSQkDQoNCmBgYA0KRm9yIG9wZXJhdGlvbnMgd2l0aCBtYXRyaXggeW91IGNhbiBhbHNvIHVzZSAkXG1hdGhiZnt5fT1cbWF0aGJme1h9XGJldGEkLCBmb3IgZXhhbXBsZS4NCg0KYGBgDQokXG1hdGhiZnt5fT1cbWF0aGJme1h9XGJldGEkDQoNCmBgYA0KDQojIyBBbGlnbm1lbnQgYW5kIGNvbW1lbnRzOg0KDQpZb3UgY2FuIHVzZSAifiIgdG8gYWRkIHNvbWUgc3BhY2VzIGluIHRoZSBmb3JtdWxhOg0KJCQgeF97aX0gKyB5X3tpfSBcZ2UgMCB+fn5+fn5+XGZvcmFsbH5pIFxpbiBcbWF0aGJie1J9ICQkDQpgYGANCiQkIHhfe2l9ICsgeV97aX0gXGdlIDAgfn5+fn5+flxmb3JhbGx+aSBcaW4gXG1hdGhiYntSfSAkJA0KDQpgYGANClRoZSBmb3JtdWxhIGluc2VydGVkIGluICJpbmRleCIgdG9waWMsIHdhc24ndCBjb21wbGV0ZWx5IHNob3duIGF0IHRoYXQgdGltZS4gVG8gd3JpdGUgZm9ybXVsYXMgdG9nZXRoZXIgd2l0aCBjb21tZW50cywgaXMgbmVjZXNzYXJ5IHRvIHVzZSB0aGUgZm9sbG93aW5nIHN5bnRheDoNCg0KYGBgDQokJA0KXGJlZ2lue2FsaWdufQ0KeF9pLCB4X3tpfSAmJiBcdGV4dHsoU3Vic2NyaXB0KX1cXA0KeF4yICYmIFx0ZXh0eyhTdXBlcnNjcmlwdCl9XFwNCnheMl9pLH54XjJfe2ksan0gJiYgXHRleHR7KENvbWJpbmVkKX1cICANClxlbmR7YWxpZ259DQokJA0KDQpgYGANCkJlc2lkZXMgdGhhdCwgd2hlbiBzb2x2aW5nIGxhcmdlIGV4cHJlc3Npb25zLCBtaWdodCBiZSB1c2VmdWwgdG8gdXNlIHNvbWUgYWxpZ25tZW50Og0KDQokJFxiZWdpbnthbGlnbn0NCiAgICAgIDVcdGltZXMgYX4rfjEwICY9MzAgXFwNCiAgICAgIDVcdGltZXMgYSAmPSAyMCBcXA0KICAgICAgYSAmPSA0DQpcZW5ke2FsaWdufSQkDQoNCmBgYA0KJCRcYmVnaW4NCiAgICAgIDVcdGltZXMgYX4rfjEwICY9MzAgXFwNCiAgICAgIDVcdGltZXMgYSAmPSAyMCBcXA0KICAgICAgYSAmPSA0DQpcZW5kJCQNCg0KYGBgDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIExpbmtzICAgDQoNClRvIGluc2VydCBoeXBlcmxpbmtzLCB5b3UgY2FuIHR5cGU6IFtSLXN0dWRpb10oaHR0cHM6Ly93d3cucnN0dWRpby5jb20pIG9yIGh0dHBzOi8vd3d3LnJzdHVkaW8uY29tICAgDQoNCg0KYGBgDQoNCltSLXN0dWRpb10oaHR0cHM6Ly93d3cucnN0dWRpby5jb20pICAgICAgDQpvciAgICAgDQpodHRwczovL3d3dy5yc3R1ZGlvLmNvbSAgIA0KDQoNCmBgYA0KDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIEltYWdlcyAgIA0KDQpGb3IgaW1hZ2VzLCB0aGUgc3ludGF4IGlzIHZlcnkgc2ltaWxhciB0byBsaW5rczogICANCg0KIVtUaGUgYW1hemluZyBIb25nIEtvbmddKEM6L1VzZXJzL2dhYnJpZWxhLm1vdXJhby9Eb2N1bWVudHMvNi1QRVNTT0FML3RpbW9uLXN0dWRsZXItNDk5OTItdW5zcGxhc2guanBnKV5bcGhvdG8gYnkgdGltb24gc3R1ZGxlciBvbiB1bnNwbGFzaF0NCg0KYGBgDQoNCiFbVGhlIGFtYXppbmcgSG9uZyBLb25nXShDOi9Vc2Vycy9nYWJyaWVsYS5tb3VyYW8vRG9jdW1lbnRzLzYtUEVTU09BTC90aW1vbi1zdHVkbGVyLTQ5OTkyLXVuc3BsYXNoLmpwZyleW3Bob3RvIGJ5IHRpbW9uIHN0dWRsZXIgb24gdW5zcGxhc2hdICANCg0KDQpgYGANCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMgVGFibGVzICAgICAgDQoNCkluc2VydGluZyBtYW51YWwgdGFibGVzIGluIFJtYXJrZG93biBpcyB2ZXJ5IGVhc3k6DQoNCnxOdW1iZXIgU2VjdGlvbnxTZWN0aW9uIE5hbWV8DQp8Oi0tLTp8Oi0tLTp8DQp8MS4wfFRleHQgRm9ybWF0YXRpb258DQp8Mi4wfE91dHB1dCBmb3JtYXRzfA0KfDMuMHxDb2RlIG9wdGlvbnN8DQp8NC4wfEZvcm11bGFzfA0KfDUuMHxMaW5rc3wNCnw2LjB8SW1hZ2VzfA0KfDcuMHxUYWJsZXN8DQoNCg0KDQpgYGANCnxOdW1iZXIgU2VjdGlvbnxTZWN0aW9uIE5hbWV8DQp8Oi0tLTp8Oi0tLTp8DQp8MS4wfFRleHQgRm9ybWF0YXRpb258DQp8Mi4wfE91dHB1dCBmb3JtYXRzfA0KfDMuMHxDb2RlIG9wdGlvbnN8DQp8NC4wfEZvcm11bGFzfA0KfDUuMHxMaW5rc3wNCnw2LjB8SW1hZ2VzfA0KfDcuMHxUYWJsZXN8DQoNCmBgYA0KDQojIFJlZmVyZW5jZXMNCg0KRm9sbG93aW5nIGFyZSB0aGUgcmVmZXJlbmNlcyB1c2VkIGluIHRoaXMgdHV0b3JpYWwuIFRoZXkgYXJlIHZlcnkgY29tcGxldGUgYW5kIHVzZWZ1bCwgSSBzdWdlc3QgdGhhdCB5b3UgY2hlY2sgaXQgZm9yIG1vcmUgaW5mb3JtYXRpb25zIGFib3V0IFJtYXJrZG93bi4NCg0KaHR0cHM6Ly9ib29rZG93bi5vcmcveWlodWkvcm1hcmtkb3duLw0KaHR0cHM6Ly9vZWlzLm9yZy93aWtpL0xpc3Rfb2ZfTGFUZVhfbWF0aGVtYXRpY2FsX3N5bWJvbHMNCmh0dHA6Ly93d3cubWF0aC5tY2dpbGwuY2EveXlhbmcvcmVncmVzc2lvbi9STWFya2Rvd24vZXhhbXBsZS5odG1sDQpodHRwczovL2dpc3QuZ2l0aHViLmNvbS9kZXJla21jbG91Z2hsaW4vODk2ZGEyMjUxOGVmMmYzZDgxYjANCmh0dHBzOi8vd3d3Lm1hdGhzLnRjZC5pZS9+ZHdpbGtpbnMvTGFUZVhQcmltZXIvQ2FsY3VsdXMuaHRtbCAgIA0KICAgDQogICANCioqSSBob3BlIHlvdSBmb3VuZCB0aGlzIHR1dG9yaWFsIGhlbHBmdWwhIENoZWVycyEgOikqKg0KDQo=